]> dgit.raspbian.org Git - gnome-shell.git/commitdiff
notification: Pass policy in the Source contructor
authorFlorian Müllner <fmuellner@gnome.org>
Tue, 6 Feb 2024 17:16:29 +0000 (18:16 +0100)
committerMarge Bot <marge-bot@gnome.org>
Fri, 9 Feb 2024 11:12:51 +0000 (11:12 +0000)
Commit 932ccac1 changed Source to use a regular constructor
instead of `_init()`.

Unfortunately that results in ordering issues for subclasses
that override `_createPolicy()`, if that method needs to access
any properties that are set in the constructor (as `this` is
only available after chaining up to the parent).

We can fix that by simply setting the policy from the constructor,
instead of relying on some overriden method being called.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/3170>

js/ui/components/telepathyClient.js
js/ui/extensionSystem.js
js/ui/notificationDaemon.js
js/ui/windowAttentionHandler.js

index 04d6f3af794cc32fa5d29c38466f709dffa411d4..9f1fa48dfd61084f6f4a61aad0ac36000600d256 100644 (file)
@@ -307,13 +307,19 @@ class TelepathyClient extends Tp.BaseClient {
 
 const ChatSource = HAVE_TP ? GObject.registerClass(
 class ChatSource extends MessageTray.Source {
-    _init(account, conn, channel, contact, client) {
+    constructor(account, conn, channel, contact, client) {
+        const appId = account.protocol_name === 'irc'
+            ? 'org.gnome.Polari'
+            : 'empathy';
+        const policy =
+            new MessageTray.NotificationApplicationPolicy(appId);
+
+        super({policy});
+
         this._account = account;
         this._contact = contact;
         this._client = client;
 
-        super._init();
-
         this._pendingMessages = [];
 
         this._conn = conn;
@@ -356,12 +362,6 @@ class ChatSource extends MessageTray.Source {
         this.pushNotification(this._notification);
     }
 
-    _createPolicy() {
-        if (this._account.protocol_name === 'irc')
-            return new MessageTray.NotificationApplicationPolicy('org.gnome.Polari');
-        return new MessageTray.NotificationApplicationPolicy('empathy');
-    }
-
     createBanner() {
         this._banner = new ChatNotificationBanner(this._notification);
 
index b3e43b13971a43f5b0e40ce0051ddef349671bad..07be8066cb50268e398cc2e74b0b10da7d941857 100644 (file)
@@ -824,20 +824,19 @@ export class ExtensionManager extends Signals.EventEmitter {
 
 const ExtensionUpdateSource = GObject.registerClass(
 class ExtensionUpdateSource extends MessageTray.Source {
-    _init() {
-        let appSys = Shell.AppSystem.get_default();
-        this._app = appSys.lookup_app('org.gnome.Extensions.desktop');
-        if (!this._app)
-            this._app = appSys.lookup_app('com.mattjakeman.ExtensionManager.desktop');
-
-        super._init({
-            title: this._app.get_name(),
-            icon: this._app.get_icon(),
+    constructor() {
+        const appSys = Shell.AppSystem.get_default();
+        const app =
+            appSys.lookup_app('org.gnome.Extensions.desktop') ||
+            appSys.lookup_app('com.mattjakeman.ExtensionManager.desktop');
+
+        super({
+            title: app.get_name(),
+            icon: app.get_icon(),
+            policy: MessageTray.NotificationPolicy.newForApp(app),
         });
-    }
 
-    _createPolicy() {
-        return new MessageTray.NotificationApplicationPolicy(this._app.id);
+        this._app = app;
     }
 
     open() {
index 899a97516fcd50b8899b0f99acddc23159157535..703316f5fb9f1a656eb4bb75a30b11fb3cd41657 100644 (file)
@@ -306,18 +306,30 @@ class FdoNotificationDaemon {
 
 export const FdoNotificationDaemonSource = GObject.registerClass(
 class FdoNotificationDaemonSource extends MessageTray.Source {
-    _init(title, pid, sender, appId) {
-        this.pid = pid;
-        this.initialTitle = title;
-        this.app = this._getApp(appId);
-        this._appIcon = null;
+    constructor(title, pid, sender, appId) {
+        const appSys = Shell.AppSystem.get_default();
+        let app;
+
+        app = Shell.WindowTracker.get_default().get_app_from_pid(pid);
+        if (!app && appId)
+            app = appSys.lookup_app(`${appId}.desktop`);
+
+        if (!app)
+            app = appSys.lookup_app(`${title}.desktop`);
 
         // Use app name as title if available, instead of whatever is provided
         // through libnotify (usually garbage)
-        super._init({
-            title: this.app?.get_name() ?? title,
+        super({
+            title: app?.get_name() ?? title,
+            policy: MessageTray.NotificationPolicy.newForApp(app),
         });
 
+        this.pid = pid;
+        this.initialTitle = title;
+        this.app = app;
+        this._appIcon = null;
+
+
         if (sender) {
             this._nameWatcherId = Gio.DBus.session.watch_name(sender,
                 Gio.BusNameWatcherFlags.NONE,
@@ -328,15 +340,6 @@ class FdoNotificationDaemonSource extends MessageTray.Source {
         }
     }
 
-    _createPolicy() {
-        if (this.app && this.app.get_app_info()) {
-            let id = this.app.get_id().replace(/\.desktop$/, '');
-            return new MessageTray.NotificationApplicationPolicy(id);
-        } else {
-            return new MessageTray.NotificationGenericPolicy();
-        }
-    }
-
     _onNameVanished() {
         // Destroy the notification source when its sender is removed from DBus.
         // Only do so if this.app is set to avoid removing "notify-send" sources, senders
@@ -361,23 +364,6 @@ class FdoNotificationDaemonSource extends MessageTray.Source {
             this.showNotification(notification);
     }
 
-    _getApp(appId) {
-        const appSys = Shell.AppSystem.get_default();
-        let app;
-
-        app = Shell.WindowTracker.get_default().get_app_from_pid(this.pid);
-        if (app != null)
-            return app;
-
-        if (appId)
-            app = appSys.lookup_app(`${appId}.desktop`);
-
-        if (!app)
-            app = appSys.lookup_app(`${this.initialTitle}.desktop`);
-
-        return app;
-    }
-
     open() {
         this.openApp();
         this.destroyNonResidentNotifications();
@@ -506,32 +492,29 @@ function InvalidAppError() {}
 
 export const GtkNotificationDaemonAppSource = GObject.registerClass(
 class GtkNotificationDaemonAppSource extends MessageTray.Source {
-    _init(appId) {
-        let objectPath = objectPathFromAppId(appId);
+    constructor(appId) {
+        const objectPath = objectPathFromAppId(appId);
         if (!GLib.Variant.is_object_path(objectPath))
             throw new InvalidAppError();
 
-        let app = Shell.AppSystem.get_default().lookup_app(`${appId}.desktop`);
+        const app = Shell.AppSystem.get_default().lookup_app(`${appId}.desktop`);
         if (!app)
             throw new InvalidAppError();
 
-        this._appId = appId;
-        this._app = app;
-        this._objectPath = objectPath;
-
-        super._init({
+        super({
             title: app.get_name(),
             icon: app.get_icon(),
+            policy: new MessageTray.NotificationApplicationPolicy(appId),
         });
 
+        this._appId = appId;
+        this._app = app;
+        this._objectPath = objectPath;
+
         this._notifications = {};
         this._notificationPending = false;
     }
 
-    _createPolicy() {
-        return new MessageTray.NotificationApplicationPolicy(this._appId);
-    }
-
     _createApp() {
         return new Promise((resolve, reject) => {
             new FdoApplicationProxy(Gio.DBus.session,
index dfce5c1b9b1bdb545711260f99393f45fc122b39..1525dae296d0762d0b98444f5d9331e085222580 100644 (file)
@@ -56,15 +56,14 @@ export class WindowAttentionHandler {
 
 const WindowAttentionSource = GObject.registerClass(
 class WindowAttentionSource extends MessageTray.Source {
-    _init(app, window) {
-        this._window = window;
-        this._app = app;
-
-        super._init({
-            title: this._app.get_name(),
-            icon: this._app.get_icon(),
+    constructor(app, window) {
+        super({
+            title: app.get_name(),
+            icon: app.get_icon(),
+            policy: MessageTray.NotificationPolicy.newForApp(app),
         });
 
+        this._window = window;
         this._window.connectObject(
             'notify::demands-attention', this._sync.bind(this),
             'notify::urgent', this._sync.bind(this),
@@ -78,15 +77,6 @@ class WindowAttentionSource extends MessageTray.Source {
         this.destroy();
     }
 
-    _createPolicy() {
-        if (this._app && this._app.get_app_info()) {
-            let id = this._app.get_id().replace(/\.desktop$/, '');
-            return new MessageTray.NotificationApplicationPolicy(id);
-        } else {
-            return new MessageTray.NotificationGenericPolicy();
-        }
-    }
-
     destroy(params) {
         this._window.disconnectObject(this);